package com.carrental.search.repository;

import com.carrental.search.model.document.VehicleDocument;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;

/**
 * 车辆索引文档的存储库接口
 * 用于定义对车辆索引的常用查询操作
 */
@Repository
public interface VehicleRepository extends ElasticsearchRepository<VehicleDocument, Long> {

    /**
     * 根据车辆品牌查询
     *
     * @param brand 车辆品牌
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByBrand(String brand);

    /**
     * 根据车辆型号查询
     *
     * @param model 车辆型号
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByModel(String model);

    /**
     * 根据车辆类型查询
     *
     * @param type 车辆类型
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByType(String type);

    /**
     * 根据门店ID查询
     *
     * @param storeId 门店ID
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByStoreId(Long storeId);

    /**
     * 根据车辆状态查询
     *
     * @param status 车辆状态（0-维护中，1-可用，2-已租出）
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByStatus(Integer status);

    /**
     * 根据日租金范围查询
     *
     * @param minDailyRent 最小日租金
     * @param maxDailyRent 最大日租金
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByDailyRentBetween(BigDecimal minDailyRent, BigDecimal maxDailyRent);

    /**
     * 根据座位数查询
     *
     * @param seats 座位数
     * @return 车辆文档列表
     */
    List<VehicleDocument> findBySeats(Integer seats);

    /**
     * 根据车辆名称、品牌或型号模糊查询
     *
     * @param keyword 关键词
     * @return 车辆文档列表
     */
    @Query("{\"bool\": {\"should\": [{\"match\": {\"name\": \"?0\"}}, {\"match\": {\"brand\": \"?0\"}}, {\"match\": {\"model\": \"?0\"}}]}}")
    List<VehicleDocument> findByKeyword(String keyword);

    /**
     * 根据是否推荐查询
     *
     * @param recommended 是否推荐
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByRecommended(Boolean recommended);

    /**
     * 根据评分范围查询
     *
     * @param minRating 最小评分
     * @param maxRating 最大评分
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByRatingBetween(Float minRating, Float maxRating);

    /**
     * 根据生产年份范围查询
     *
     * @param minYear 最小年份
     * @param maxYear 最大年份
     * @return 车辆文档列表
     */
    List<VehicleDocument> findByYearBetween(Integer minYear, Integer maxYear);
} 